home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
libs
/
mxmlib.lha
/
MXMLib
/
LibMain.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-06-02
|
8KB
|
382 lines
/* $Revision Header *** Header built automatically - do not edit! ***********
*
* (C) Copyright 1990 by MXM
*
* Name .....: LibMain.c
* Created ..: Saturday 06-Jan-90 23:30
* Revision .: 8
*
* Date Author Comment
* ========= ======== ====================
* 01-Apr-90 Olsen Rework for Aztec 5.0
* 25-Jan-90 Olsen Did some cleanups
* 14-Jan-90 Olsen Renamed to mxm.library
* 07-Jan-90 Olsen - Empty log message -
* 07-Jan-90 Olsen Appended new functions
* 06-Jan-90 Olsen - Empty log message -
* 06-Jan-90 Olsen - Empty log message -
* 06-Jan-90 Olsen Created this file!
*
* $Revision Header ********************************************************/
/* Imported from MXM.c */
extern LONG Revision;
/* ASCII library ID. */
char *LibName = "mxm.library";
char *LibId = "mxm.library 34.14 (01 Apr 1990)\r\n";
/* External data, defined in asm startup code. */
extern struct Resident LibRomTag;
extern LONG LibInit();
/* Protos for this module. */
struct MXMBase * LibMain(struct MXMBase *,BPTR);
struct MXMBase * LibOpen(VOID);
BPTR LibClose(VOID);
BPTR LibExpunge(VOID);
/* And now for the pragmas... */
#pragma amicall(MXMBase,0x06,LibOpen())
#pragma amicall(MXMBase,0x0C,LibClose())
#pragma amicall(MXMBase,0x12,LibExpunge())
/* The library initialization. */
#pragma regcall(LibMain(d0,a0))
/* The structure expected by the library loader (auto-init). */
struct InitTable
{
ULONG it_DataSize; /* Data size to allocate. */
APTR *it_FuncTable; /* Pointer to function table. */
APTR it_DataInit; /* Pointer to data initializers (remember InitStruct()?). */
APTR it_InitFunc; /* The real library init function. */
};
/* The list of library functions. */
VOID *LibFuncTab[] =
{
LibOpen, /* Standard library routines. */
LibClose,
LibExpunge,
NULL, /* Reserved, leave it NULL. */
AllocRem,
FreeRem,
CreateFuncTask,
DeleteFuncTask,
CreateFuncProc,
MovePointer,
WriteConsole,
DeletePrinterSupport,
CreatePrinterSupport,
StartPrinterDump,
StopPrinterDump,
DeleteTimer,
CreateTimer,
WaitForTimer,
TimeDelay,
KeyConvert,
InvertKey,
EraseGadget,
RefreshGadget,
GetLongInt,
SetLongInt,
GetGadgetString,
SetGadgetString,
GetToggleGadget,
SetToggleGadget,
SetWaitPointer,
PopRequest,
PopMenu,
Announce,
CheckSumCRC,
CheckSumSimple,
CryptBlock,
IsASCII,
IsPrintable,
ToUpper,
UStrCmp,
Random,
FindFileWindow,
DeleteHiddenRPort,
CreateHiddenRPort,
EnableWindow,
DisableWindow,
(VOID *)-1 /* End marker. */
};
/* The romtag needs this. */
struct InitTable LibInitTab =
{
(ULONG)sizeof(struct MXMBase), /* Lib base. */
(APTR)LibFuncTab, /* Function table. */
NULL, /* No data init table (we'll do autoinit). */
(APTR)LibInit /* Lib init routine. */
};
/* Library auxilary data. */
struct IOStdReq *kc_ConStdReq;
struct KeyEquivalent *EquList;
struct KeyMap *ik_KeyMap;
struct SignalSemaphore *PopSemaphore;
/* The libraries this library needs. */
APTR IntuitionBase;
APTR GfxBase;
APTR LayersBase;
APTR DOSBase;
APTR ConsoleDevice;
/* Global segment list (we only need one). */
BPTR LibSegList = ZERO;
/* LibMain(MXMBase,SegList):
*
* Does the main library initialization, expects
* arguments in registers.
*/
struct MXMBase *
LibMain(MXMBase,SegList)
struct MXMBase *MXMBase;
BPTR SegList;
{
/* We don't wish to be initialized twice,
* the check for LibSegList will hopefully
* insure this.
*/
if(!LibSegList)
{
/* Remember segment list. */
LibSegList = SegList;
/* Try to open the required libraries. */
if(!(IntuitionBase = (APTR)OpenLibrary("intuition.library",LIBRARY_MINIMUM)))
goto Failed;
if(!(GfxBase = (APTR)OpenLibrary("graphics.library",LIBRARY_MINIMUM)))
goto Failed;
if(!(LayersBase = (APTR)OpenLibrary("layers.library",LIBRARY_MINIMUM)))
goto Failed;
if(!(DOSBase = (APTR)OpenLibrary("dos.library",LIBRARY_MINIMUM)))
goto Failed;
if(!(kc_ConStdReq = (struct IOStdReq *)AllocMem(sizeof(struct IOStdReq),MEMF_PUBLIC | MEMF_CLEAR)))
goto Failed;
if(OpenDevice("console.device",-1,kc_ConStdReq,0))
goto Failed;
if(!(EquList = (struct KeyEquivalent *)AllocMem(sizeof(struct KeyEquivalent) * 94,MEMF_PUBLIC | MEMF_CLEAR)))
goto Failed;
if(!(ik_KeyMap = (struct KeyMap *)AllocMem(sizeof(struct KeyMap),MEMF_PUBLIC | MEMF_CLEAR)))
goto Failed;
if(!(PopSemaphore = (struct SignalSemaphore *)AllocMem(sizeof(struct SignalSemaphore),MEMF_PUBLIC | MEMF_CLEAR)))
goto Failed;
InitSemaphore(PopSemaphore);
ConsoleDevice = (APTR)kc_ConStdReq -> io_Device;
/* Fill in the library head. */
MXMBase -> LibNode . lib_Node . ln_Type = NT_LIBRARY;
MXMBase -> LibNode . lib_Node . ln_Name = LibName;
MXMBase -> LibNode . lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;
MXMBase -> LibNode . lib_Version = LibRomTag . rt_Version;
MXMBase -> LibNode . lib_Revision = Revision;
MXMBase -> LibNode . lib_IdString = (APTR)LibId;
MXMBase -> IntuitionBase = IntuitionBase;
MXMBase -> GfxBase = GfxBase;
MXMBase -> LayersBase = LayersBase;
MXMBase -> DOSBase = DOSBase;
MXMBase -> ConsoleDevice = ConsoleDevice;
return(MXMBase);
Failed: if(IntuitionBase)
CloseLibrary(IntuitionBase);
if(GfxBase)
CloseLibrary(GfxBase);
if(LayersBase)
CloseLibrary(LayersBase);
if(ConsoleDevice)
CloseDevice(kc_ConStdReq);
if(DOSBase)
CloseLibrary(DOSBase);
if(EquList)
FreeMem(EquList,sizeof(struct KeyEquivalent) * 94);
if(kc_ConStdReq)
FreeMem(kc_ConStdReq,sizeof(struct IOStdReq));
if(ik_KeyMap)
FreeMem(ik_KeyMap,sizeof(struct KeyMap));
if(PopSemaphore)
FreeMem(PopSemaphore,sizeof(struct SignalSemaphore));
LibSegList = ZERO;
return(NULL);
}
}
/* LibOpen():
*
* Library open routine.
*/
struct MXMBase *
LibOpen()
{
struct MXMBase *MXMBase;
/* Check if everything is in good shape. */
if(!IntuitionBase || !GfxBase || !LayersBase || !DOSBase || !ConsoleDevice || !EquList || !kc_ConStdReq || !ik_KeyMap)
return(NULL);
/* Increment open count. */
MXMBase -> LibNode . lib_OpenCnt++;
MXMBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
/* Return base pointer. */
return(MXMBase);
}
/* LibClose():
*
* Closes the library.
*/
BPTR
LibClose()
{
struct MXMBase *MXMBase;
BPTR SegList = ZERO;
/* Time for an expunge? */
if(MXMBase -> LibNode . lib_OpenCnt > 0)
{
MXMBase -> LibNode . lib_OpenCnt--;
SegList = LibExpunge();
}
else
Alert(AT_Recovery | AG_CloseLib,"MXM");
return(SegList);
}
/* LibExpunge(MXMBase):
*
* Expunge library, careful: this can be called by
* ramlib while the rest of the library doesn't know
* about it.
*/
BPTR
LibExpunge()
{
struct MXMBase *MXMBase;
BPTR SegList = ZERO;
/* Is user count zero, the delayed expunge flag
* set and the library seglist valid?
*/
if(MXMBase -> LibNode . lib_OpenCnt == 0 && (MXMBase -> LibNode . lib_Flags & LIBF_DELEXP) && LibSegList)
{
/* Remember segment list. */
SegList = LibSegList;
LibSegList = ZERO;
/* Remove library from lib list. */
Remove((struct Node *)MXMBase);
/* Some paranoid action. */
MXMBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
/* Close what we've opened. */
if(IntuitionBase)
CloseLibrary(IntuitionBase);
if(GfxBase)
CloseLibrary(GfxBase);
if(LayersBase)
CloseLibrary(LayersBase);
if(ConsoleDevice)
CloseDevice(kc_ConStdReq);
if(DOSBase)
CloseLibrary(DOSBase);
if(EquList)
FreeMem(EquList,sizeof(struct KeyEquivalent) * 94);
if(kc_ConStdReq)
FreeMem(kc_ConStdReq,sizeof(struct IOStdReq));
if(ik_KeyMap)
FreeMem(ik_KeyMap,sizeof(struct KeyMap));
if(PopSemaphore)
FreeMem(PopSemaphore,sizeof(struct SignalSemaphore));
/* Free library mem. */
FreeMem((char *)MXMBase - MXMBase -> LibNode . lib_NegSize,MXMBase -> LibNode . lib_NegSize + MXMBase -> LibNode .lib_PosSize);
}
else
{
/* In any other case we'll set the delayed
* expunge flag (so next expunge call will
* hopefully wipe us from the lib list.
*/
MXMBase -> LibNode . lib_Flags |= LIBF_DELEXP;
}
/* Return segment list pointer. */
return(SegList);
}